﻿// Inner Fire 游戏引擎库
// DxSwapchain 渲染器Swapchain管理器
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 用于DirectX的渲染器。
// 此文件分装Swapchain管理器
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-04-23

#pragma once

#include <dx/core/dx_core.h>

namespace ifire::dx {
class DxGraphics;

class DxSwapchain {
public:
  DxSwapchain(DxGraphics* dx);
  DxSwapchain(const DxSwapchain& rhs) = delete;
  DxSwapchain& operator=(const DxSwapchain& rhs) = delete;
  ~DxSwapchain() = default;

  // 创建SwapChain
  void CreateSwapChain();
  // 清空状态，以便于重建。在OnResize的时候发生
  void Reset();
  // 创建RTV
  void CreateRenderTargetView();
  // 创建DSV
  void CreateDepthStencilView();
  // Present之后，切换Buffer
  void PresentAndSwap();

  // ------
  // 属性访问
  // ------
  IDXGISwapChain* GetSwapChain() { return swap_chain_.Get(); }
  ID3D12Resource* GetBackBuffer() const;
  D3D12_CPU_DESCRIPTOR_HANDLE GetBackBufferView() const;
  ID3D12Resource* GetDepthStencil() {
    return depth_stencil.Get();
  }

private:
  // 用于交换链
  ComPtr<IDXGISwapChain> swap_chain_;
  ComPtr<ID3D12Resource> swap_chain_buffer_[SWAP_CHAIN_BUFFER_COUNT];
  ComPtr<ID3D12Resource> depth_stencil;
  int current_back_buffer_;
  DxGraphics* dx_;
};

} // namespace ifire::dx